#ifndef OJLB_OJ_COMPILER_OJ_RUNER_H_
#define OJLB_OJ_COMPILER_OJ_RUNER_H_
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/resource.h>
#include <utility>
#include <stdexcept>
#include "oj_common/oj_code_file.h"
#include "oj_common/oj_log.h"
#include "oj_common/oj_strea_edirection.h"
namespace ojlb {
namespace oj_compiler_run {


// 类定义
class OjRuner {
public:
    static std::pair<bool, int> run(const oj_common::OjCodeFile& oj_code_file, const time_t& max_cpu_se = RLIM_INFINITY, const size_t& max_memory_kb = RLIM_INFINITY); // 运行方法

private:
    static void checkRunEnv(const oj_common::OjCodeFile& oj_code_file); // 检查运行环境
    static void cleanRunEnv(const oj_common::OjCodeFile& oj_code_file); // 清理运行环境
    static void handleForkError(); // 处理编译异常
    static void handleChildProcess(const oj_common::OjCodeFile& oj_code_file, const time_t& max_cpu_sec, const size_t& max_memory_kb); // 处理子进程任务
    static std::pair<bool, int> handleParentProcess(const pid_t& fork_result, oj_common::OjStreaEdirection ojse_err, oj_common::OjStreaEdirection ojse_out); // 处理父进程任务
    static void setCpuTimeAndMemoryLimit(const int& max_cpu_sec, const int& max_memory_kb); // 算法复杂度限制(s, kb)

private:
    static const int size_of_kb = 1024; // TODO: 赌一把...编译不会出错....
}; // class OjRuner end


} // namespace oj_compiler_run end
} // namespace ojlb end
#endif
